#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QKeyEvent>
#include <QTimerEvent>
#include <QCloseEvent>
#include <QMessageBox>
#include <QEvent>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    timeId = this->startTimer(1000); //以毫秒为单位  每隔一秒触发定时器
    timeId2 = this->startTimer(500);
    connect(ui->pushButton,&myButton::clicked,
            [=]()
            {
                qDebug() << "按钮被按下！";
            }
            );
    //安装过滤器
    ui->label_2->installEventFilter(this);
}

//键盘点击事件
void Widget::keyPressEvent(QKeyEvent *event)
{
    qDebug() << event->key();
}
//计时器事件
void Widget::timerEvent(QTimerEvent *event)
{
    if(event->timerId() == timeId)
    {
        static int sec = 0;
        ui->label->setText(QString("<center><h1>Time out: %1</h1></center>").arg(sec++));

        if( 10 == sec)
        {
            //10秒停止
            this->killTimer(this->timeId);
        }
    }
    else
    {
        static int sec = 0;
        ui->label_2->setText(QString("<center><h1>Time out: %1</h1></center>").arg(sec++));

        if( 10 == sec)
        {

            this->killTimer(this->timeId);
        }
    }
}
//鼠标点击事件
void Widget::mousePressEvent(QMouseEvent *event)
{
    qDebug() << "++++";
}
//关闭事件
void Widget::closeEvent(QCloseEvent *event)
{
    //静态成员函数
    int ret = QMessageBox::question(this,"question","是否关闭窗口");
    if(ret == QMessageBox::Yes)
    {
        //关闭窗口
        //处理关闭窗口事件，接收事件，事件就不会再往下传递
        event->accept();
    }
    else
    {
        //不关闭窗口
        //忽略事件，事件继续给父组件传递
        event->ignore();
    }
}
//重写event事件
bool Widget::event(QEvent *event)
{
    // 对于定时器事件: 它直接返回true。这意味着该事件被视为“已处理”，
    //               因此程序将不会再调用timerEvent函数。这导致你在界面上看不到秒数更新，
    //              因为更新逻辑在timerEvent中。
    if( event->type() == QEvent::Timer )
    {
        //关闭定时器
        // 如果返回true，事件停止传播
        //类型转换
        // QTimerEvent *event = static_cast<QTimerEvent*>(event);
        // timerEvent(event);
        return true; //已经处理
    }

    // 对于键盘事件: 它检查按下的键是否为'B'。如果不是'B'，
    //             它也返回true，吞掉（拦截）该事件，导致keyPressEvent不会被调用。
    //             只有当按下'B'键时，它才会调用基类的event函数，让事件继续被正常处理
    else if( event->type() == QEvent::KeyPress)
    {
        //类型转换 将父类QEvent转换为子类QKeyEvent，更好调用子类接口
        QKeyEvent* env = static_cast<QKeyEvent*>(event);
        if(env->key() == Qt::Key_B)
        {
            return QWidget::event(event);
        }
        return true;
    }
    else
    {
        return QWidget::event(event);
    }
}
//重写事件过滤器 -- 过滤鼠标事件
bool Widget::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == ui->label_2)
    {
        QMouseEvent* env = static_cast<QMouseEvent*>(event);
        if(event->type() == QEvent::MouseMove)
        {
            ui->label_2->setText(QString("Mouse Move:(%1,%2)").arg(env->x()).arg(env->y()));
            return true;
        }
        return QWidget::eventFilter(watched,event);
    }
    else
    {
        return QWidget::eventFilter(watched,event);

    }
}
Widget::~Widget()
{
    delete ui;
}















